package com.navinfo.platform.trip.common.arithmetic.var;

import com.navinfo.platform.trip.common.arithmetic.enums.WorkingConditionEnum;
import lombok.Data;
import org.apache.flink.shaded.guava18.com.google.common.collect.EvictingQueue;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * 东风新版——工况算法{@link com.navinfo.platform.trip.common.arithmetic.WorkingCondition_DFN}的统计变量
 * @author: web
 * @date: 2020-07-06
 **/
@Data
public class VarWorkingCondition {
    /**
     *  前一点工况
     */
    private WorkingConditionEnum preStatus;

    /**
     * 除怠速工况的其他工况位置点的缓存定长队列，用来求平均速度<br/>
     * 为了将车速按照前1个点及后1个点累加再除3
     */
    private EvictingQueue<CachePoint> cachePoints = EvictingQueue.create(3);

    /**
     * 怠速工况缓存数据列表<br/>
     * 每个怠速工况数据的位置点中，可能还有异常点（speed>0 && speed<=2），后期需处理
     */
    private List<CacheCondition> idleConditions = new ArrayList<>();
    /**
     * 低速工况缓存数据列表
     */
    private List<CacheCondition> lowConditions = new ArrayList<>();
    /**
     * 加速工况缓存数据列表
     */
    private List<CacheCondition> accConditions = new ArrayList<>();
    /**
     * 减速工况缓存数据列表
     */
    private List<CacheCondition> decConditions = new ArrayList<>();
    /**
     * 匀速工况缓存数据列表
     */
    private List<CacheCondition> uniformConditions = new ArrayList<>();

    /**
     * 缓存位置点
     */
    @Data
    public static class CachePoint {
        /**
         * gps时间，单位ms
         */
        private long gpsTime;
        /**
         * 上个点的gps时间，单位ms
         **/
        private long lastGpsTime;
        /**
         * 当前点原始速度，单位m/s
         */
        private BigDecimal oldSpeed;
        /**
         * 上一点原始速度，单位m/s
         */
        private BigDecimal lastOldSpeed;
        /**
         * 处理过的当前点速度，单位km/h
         */
        private float newSpeed;
        /**
         * 处理过的上一点速度，单位km/h
         */
        private float lastNewSpeed;
        /**
         * 转速，单位：rpm（转每分钟）
         */
        private int rotation;
        /**
         * 油门开度，单位：%(公共)
         */
        private int throttlePosition;
        /**
         * 发动机燃油消耗率,单位：L/h，计算油耗使用
         */
        private BigDecimal fuelConsumptionRate;
    }

    /**
     * 工况的缓存数据
     */
    @Data
    public static class CacheCondition{
        /**
         * 该工况的开始时间，单位ms
         */
        private long startTime;
        /**
         * 该工况的开始速度，单位km/h
         */
        private float startSpeed;
        /**
         * 该工况的位置点
         */
        private List<CachePoint> points = new ArrayList<>();

        /**
         * 增加位置点
         * @param point 位置点
         */
        public void addPoint(CachePoint point){
            this.points.add(point);
        }
        /**
         * 增加位置点
         * @param points 位置点
         */
        public void addAllPoints(Collection<CachePoint> points){
            this.points.addAll(points);
        }
    }

    /**
     * 工况的统计结果对象
     */
    @Data
    public static class ConditionResult {
        /**
         * 累加时长，单位s
         */
        private int duration;
        /**
         * 累加油耗，单位ml
         */
        private double fuel;

        /**
         * 速度平均值，扩大100倍，单位:km/h<br/>
         * 每段工况的速度累加求平均值
         */
        private int speedAvg;
        /**
         * 车速标准差，扩大100倍，单位:km/h<br/>
         * 每段工况的速度累加求标准差
         **/
        private int speedStDev;
        /**
         * 加速度平均值，扩大100倍，单位:m/s2<br/>
         * 累加每段工况的加速度平均值，再求平均值
         **/
        private int accelerationAvg;
        /**
         * 加速度标准差，扩大100倍，单位:m/s2 <br/>
         * 每段工况的加速度累加求标准差
         **/
        private int accelerationStDev;
        /**
         * 发动机转速平均值，扩大100倍，单位:rpm转每分钟<br/>
         * 每段工况的转速累加求平均值
         **/
        private int rpmAvg;
        /**
         * 发动机转速标准差，扩大100倍，单位:rpm转每分钟<br/>
         * 每段工况的转速累加求标准差
         **/
        private int rpmStDev;
        /**
         * 油门开度平均值，扩大100倍，单位:%<br/>
         * 每段工况的油门开度累加求平均值
         **/
        private int throttleAvg;
        /**
         *  油门开度标准差，扩大100倍，单位:%<br/>
         * 每段工况的油门开度累加求标准差
         **/
        private int throttleStDev;
        /**
         * 油门开度变化率平均值，扩大100倍 单位:%<br/>
         * 累加每段工况的油门开度变化率平均值，再求平均值
         **/
        private int throttleRateAvg;
        /**
         *  油门开度变化率标准差，扩大100倍 单位:%<br/>
         * 每段工况的油门开度变化率累加求标准差
         **/
        private int throttleRateStDev;

        public void addDuration(int duration){
            this.duration += duration;
        }
        public void addFuel(double fuel){
            this.fuel += fuel;
        }
    }
}
